package com.huanong.it.fooder.service.impl;

import com.huanong.it.fooder.dto.OrderDTO;
import com.huanong.it.fooder.entity.Order;
import com.huanong.it.fooder.entity.User;
import com.huanong.it.fooder.repository.OrderRepository;
import com.huanong.it.fooder.repository.UserRepository; // 引入用户仓库
import com.huanong.it.fooder.service.OrderService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;
import java.util.stream.Collectors;

@Service
public class OrderServiceImpl implements OrderService {

    @Autowired
    private OrderRepository orderRepository;

    @Autowired
    private UserRepository userRepository; // 注入用户仓库

    /**
     * 创建新的订单
     *
     * @param orderDTO 包含订单信息的DTO
     * @return 创建的订单的DTO
     */
    @Override
    public OrderDTO createOrder(OrderDTO orderDTO) {
        Order order = new Order();

        // 根据 userId 查找用户
        User user = userRepository.findById(orderDTO.getUserId())
                .orElseThrow(() -> new RuntimeException("User not found"));

        // 设置订单的用户
        order.setUser(user);

        // 设置订单的总价、状态和创建时间
        order.setTotalPrice(orderDTO.getTotalPrice());
        order.setStatus(orderDTO.getStatus());
        order.setCreatedAt(orderDTO.getCreatedAt());

        // 处理订单项（如果有）
        // 这里可以添加逻辑来处理订单项，例如将购物车中的商品添加到订单中

        // 保存订单并返回DTO
        Order savedOrder = orderRepository.save(order);
        return convertToDTO(savedOrder);
    }

    /**
     * 根据ID获取订单
     *
     * @param id 订单的ID
     * @return 订单的DTO
     */
    @Override
    public OrderDTO getOrderById(Long id) {
        // 查找订单，如果未找到则抛出异常
        Order order = orderRepository.findById(id)
                .orElseThrow(() -> new RuntimeException("Order not found"));
        return convertToDTO(order);
    }

    /**
     * 获取所有订单
     *
     * @return 所有订单的DTO列表
     */
    @Override
    public List<OrderDTO> getAllOrders() {
        // 查找所有订单并转换为DTO列表
        List<Order> orders = orderRepository.findAll();
        return orders.stream().map(this::convertToDTO).collect(Collectors.toList());
    }

    /**
     * 更新订单
     *
     * @param id        订单的ID
     * @param orderDTO  包含更新信息的DTO
     * @return 更新后的订单的DTO
     */
    @Override
    public OrderDTO updateOrder(Long id, OrderDTO orderDTO) {
        // 查找订单，如果未找到则抛出异常
        Order order = orderRepository.findById(id)
                .orElseThrow(() -> new RuntimeException("Order not found"));

        // 更新订单的总价、状态和创建时间
        order.setTotalPrice(orderDTO.getTotalPrice());
        order.setStatus(orderDTO.getStatus());
        order.setCreatedAt(orderDTO.getCreatedAt());

        // 更新用户（如果需要）
        if (!order.getUser().getId().equals(orderDTO.getUserId())) {
            User user = userRepository.findById(orderDTO.getUserId())
                    .orElseThrow(() -> new RuntimeException("User not found"));
            order.setUser(user);
        }

        // 保存更新后的订单并返回DTO
        Order updatedOrder = orderRepository.save(order);
        return convertToDTO(updatedOrder);
    }

    /**
     * 删除订单
     *
     * @param id 订单的ID
     */
    @Override
    public void deleteOrder(Long id) {
        // 删除订单
        orderRepository.deleteById(id);
    }

    /**
     * 将Order实体转换为OrderDTO
     *
     * @param order 订单实体
     * @return 转换后的订单DTO
     */
    private OrderDTO convertToDTO(Order order) {
        OrderDTO dto = new OrderDTO();
        dto.setId(order.getId());
        dto.setUserId(order.getUser().getId()); // 获取用户ID
        dto.setTotalPrice(order.getTotalPrice());
        dto.setStatus(order.getStatus());
        dto.setCreatedAt(order.getCreatedAt());
        // 如果需要，可以在这里设置订单项
        // dto.setOrderItems(order.getOrderItems().stream().map(this::convertToOrderItemDTO).collect(Collectors.toList()));
        return dto;
    }

    // 如果需要，可以添加一个方法将OrderItem转换为DTO
    // private OrderItemDTO convertToOrderItemDTO(OrderItem orderItem) {
    //     // 转换逻辑
    // }
}
